#pragma once

#include "TableCommon.h"
#include "TableColumn.h"
#include <vector>

namespace qb{
	namespace ht{
		//////////////////////////////////////////////////////////////////////////
		class SortBuffer{		// 减少内存，以便只加载排序列
			bool					m_all_columns;		// 
            std::vector<ColumnInfo>	m_columns;			// 保存表格的当前用户的排序列信息,可能是多重排序
			int					m_record_length;		// 每条记录所占据的内存大小,包括末尾的4字节对齐padding
			int					m_record_count;		// 当前要排序的记录条数
			int					m_buffer_size;		// m_buffer的当前实际大小
			char*				m_buffer;			// 所有要排序记录的排序字段组成的临时缓冲区

			// 索引模式暂时不使用
			bool					m_issorting;			// true表示当前为排序模式，false表示为索引模式
			int					m_extract_gap;		// 每间隔多少个row，从TableUser的所有rowmap中抽取当前排序字段组成的记录
			int					m_extract_gap_exp;	// 2^m_extract_gap_exp==m_extract_gap,加速处理，要求m_extract_gap只能是1,2,4,8,...
			int					m_extract_gap_offset;	// [0,m_extract_gap),默认为0
			friend class TableSorter;
		public:
			SortBuffer();
			virtual ~SortBuffer();

			void CLearColumns();
			void AddColumn(const ColumnInfo& ci, bool dec);

			char* PrepareBuffer(int rowCount);
			int GetRecordSize()const{ return m_record_length; }
			int GetRecordCount()const{ return m_record_count; }
			int GetRecordId(int row)const;


            Range FindRow(RecordId rid, const void* record, int size, int rowCount, const std::vector<ColumnInfo>& columns);
			void ConvertToIndexing();

			int GetColumnCount(){ return m_columns.size(); }
		protected:
			char* GetBuffer(){ return m_buffer; }
			int CompareSortRecord(const void* pSortData1, const void* pSortData2);
		};
	}//namespace ht
}//namespace qb
